/*
 * @Description: 泛型类
 * @Autor: HuiSir<273250950@qq.com>
 * @Date: 2021-05-06 18:36:24
 * @LastEditTime: 2021-05-18 00:14:12
 */

(function () {

    /**
     * 在不确定类的属性的类型或方法的参数类型时可以使用泛型类
     * 在类的名字后添加泛型变量<T> 
     */
    class Test<T>{
        defaultVal: T | undefined
        add: (a: T, b: T) => T  //在严格模式下，类中的属性或方法必须赋值
    }

    // 实例化时确定类型
    const test: Test<number> = new Test<number>()

    // 赋值
    test.defaultVal = 10
    test.add = function (a: number, b: number): number {
        return a + b
    }

    console.log(test.add(1, 2)) //3
    console.log(test.add(1, test.defaultVal)) // 11

    // 实例化时确定类型
    const test2: Test<string> = new Test<string>()

    // 赋值
    test2.defaultVal = "haha"
    test2.add = function (a: string, b: string): string {
        return a + b
    }

    console.log(test2.add("ni", "hao")) // nihao
    console.log(test2.add("nihao ", test2.defaultVal)) // nihao haha
})()